package DoublePointer;

import org.junit.Test;

/**
 * @BelongsProject: SeniorArchitect-LeetCode
 * @BelongsPackage: DoublePointer
 * @Author: zhuangxiaoyan
 * @CreateTime: 2023-10-18  19:41
 * @Description: TODO
 * @Version: 1.0
 */
public class 验证回文串125 {

    // 采用双指针的方式来实现 在移动任意一个指针时，需要不断地向另一指针的方向移动，直到遇到一个字母或数字字符，或者两指针重合为止。
    // 也就是说，我们每次将指针移到下一个字母字符或数字字符，再判断这两个指针指向的字符是否相同。

    public boolean isPalindrome(String s) {
        int n=s.length();
        int left=0;
        int right=n-1;
        while (left<right){
            while (left<right&&!Character.isLetterOrDigit(s.charAt(left))){
                left++;
            }
            while (left<right&&!Character.isLetterOrDigit(s.charAt(right))){
                right--;
            }
            if (left<right){
                if (Character.toLowerCase(s.charAt(left++))!=Character.toLowerCase(s.charAt(right--))){
                    return false;
                }
            }
        }
        return true;
    }


    // 时间为o(n) 空间为log(n)
    public boolean isPalindrome2(String s) {
        s = s.toLowerCase();
        String new_str = "";
        for (int i = 0; i < s.length(); i++) {
            if ((s.charAt(i) >= 'a' && s.charAt(i) <= 'z')||(s.charAt(i) >= '0' && s.charAt(i) <= '9')) {
                new_str += s.charAt(i);
            }
        }
        int left = 0;
        int right = new_str.length() - 1;
        while (left <= right) {
            if (new_str.charAt(left++) != new_str.charAt(right--)) {
                return false;
            }
        }
        return true;
    }

    @Test
    public void test(){
        boolean palindrome = isPalindrome("");
        System.out.println(palindrome);
    }
}
